#ifndef __FOC_H
#define __FOC_H


#include "stdint.h"


/* ====================== 自定义常量 =========================== */




/* ===================== 自定义结构体 ========================== */

/*
	增量式PI调节（电流/力矩/FOC环）
*/
struct PI_Struct
{
    /* data */
    float kp;           // 比例
    float ki;           // 积分
    float kd;           // 微分

    float pre;          // 实际
    float tar;          // 目标
    float bias;         // 目标与实际之前差值（目标-实际）
    float lastBias;		// 上次差值
    float out;          // 输出
    float outMax;       // 输出限幅
	
	float integral;		// 误差积分：位置式PID需要的参数
};

/*
	FOC结构体（FOC中间参数）
*/
typedef struct
{
    uint8_t isEnable;	// 电机使能标志
    uint8_t polePairs;	// 极对数

    float tariq;		// 目标电流
    float tarid;		// 目标电流
	
	float mAngle;		// 机械角度
    float eAngle;		// 电角度
    float eRadian;		// 电角度的弧度

	uint8_t iNum;		// 电流采样个数
    float ia;			// a 相实际电流
	float ib;			// b 相实际电流
	float ic;			// c 相实际电流
    float i_alpha;		// clarke变换后 * 2/3后 Iα
    float i_beta;		// clarke变换后 * 2/3后 Iβ
    float iq;			// park变换后 Iq
    float id;			// park变换后 Id

    float i_alpha_SVPWM;	// park反变换后 Iα
    float i_beta_SVPWM;		// park反变换后 Iβ

    struct PI_Struct idPID;	// d向量的pid参数结构体
    struct PI_Struct iqPID;	// q向量的pid参数结构体
	
	
	// 所需函数
	void (*SetEnable)(uint8_t isEnable);
	float (*GetEncoderAngle)(void);
	uint8_t (*GetSVPWMSector)(void);
	void (*GetPreCurrent)(float *ua,float *ub,float *uc);
	void (*SvpwmGenerate)(float u_alpha,float u_beta);
	
}FOC_Struct;
typedef FOC_Struct *PFOC_Struct;


/* ======================= 对外接口 ============================ */

void FocContorl(PFOC_Struct pFOC);
void SetCurrentPIDTar(PFOC_Struct pFOC, float tarid, float tariq);
void SetCurrentPIDParams(PFOC_Struct pFOC, float kp, float ki, float kd, float outMax);
void SetFocEnable(PFOC_Struct pFOC, uint8_t isEnable);
void FocPrintf(PFOC_Struct pFOC);
float GetFocAngle(PFOC_Struct pFOC);



#endif /* __FOC_H */






